<?php
/**
 * Description of UsuarioDAO
 *
 * @author Magno
 */
class UsuarioDAO {

    protected $conexao;
    protected $mediaDAO;
    protected $statusDAO;

    public function __construct() {
        $this->conexao = Conexao::getConexao();
        $this->mediaDAO = new MediaDAO();
        $this->statusDAO = new StatusDAO();
    }

    public function salvar($usuario) {

        try {

            if($usuario->getUsuarioID() <= 0 || stripos($usuario->getMedia()->getCaminho(), "Default") === FALSE){
                $usuario->setMedia($this->mediaDAO->salvar($usuario->getMedia()));
            }
            
            if ($usuario->getUsuarioID() != null && $usuario->getUsuarioID() > 0) {
                
                $statment = $this->conexao->prepare("UPDATE usuario SET
                        login = :login,                                                
                        senha = :senha,
                        email = :email,                                                
                        mediaID = :mediaID,
                        statusID = :statusID
                        WHERE usuarioID = :usuarioID");
            } else {
                
                $ip = $_SERVER['REMOTE_ADDR'];

                $statment = $this->conexao->prepare("INSERT INTO usuario(usuarioID,login,senha,email,ip,mediaID,statusID)
                    VALUES (:usuarioID,:login,:senha,:email,'$ip',:mediaID,:statusID);");
            }

            if ($statment->execute($usuario->toBD())) {

                if ($usuario->getUsuarioID() == null || $usuario->getUsuarioID() <= 0)
                    $usuario->setUsuarioID($this->conexao->lastInsertId());
                return $usuario;
            }else {
                $erros = $statment->errorInfo();
                throw new Exception("Erro UsuarioDAO: " . $erros[2]);
            }
        } catch (PDOException $err) {
            throw new Exception("Erro UsuarioDAO:" . $err->getMessage());
        }
    }

    public function excluir($usuarioID) {

        try {

            $statment = $this->conexao->prepare("DELETE FROM usuario WHERE usuarioID = :usuarioID");
            $statment->bindParam(':usuarioID', $usuarioID);

            if (!$statment->execute()) {
                $erros = $statment->errorInfo();
                throw new Exception("Erro UsuarioDAO: " . $erros[2]);
            }
        } catch (PDOException $err) {
            throw new Exception("Erro UsuarioDAO:" . $err->getMessage());
        }
    }

    public function listar($pagina = 0, $email = "", $login = "", $statusID = -1, $carregarDependencias = false) {
        try {

            $limite = Util::getPaginacao($pagina);
            $where = $this->getWhere($email, $login, $statusID);
            $usuarios = array();
            $statment = $this->conexao->query("SELECT * FROM usuario u $where $limite");

            foreach ($statment->fetchAll(PDO::FETCH_SERIALIZE) as $row){
                $usuario = new UsuarioBean($row['usuarioID'], $row['login'], $row['senha'], $row['email'], $row['ip'], Util::dateToString($row['dataCriacao']));
                $usuario->setStatus($this->statusDAO->buscarPorID($row['statusID']));

                if($carregarDependencias)
                    $usuario->setMedia($this->mediaDAO->buscarPorID($row['mediaID']));

                $usuarios[] =  $usuario;
            }

            return $usuarios;
        } catch (PDOException $err) {
            throw new Exception("Erro UsuarioDAO:" . $err->getMessage());
        }
    }

    public function listarPorOrdem($pagina = 0, $tamanho = 0, $ordem = "usuarioID", $direcao = "ASC", $carregarDependencias = false) {
        try {

            $limite = Util::getPaginacao($pagina,$tamanho);
            $usuarios = array();
            $statment = $this->conexao->query("SELECT * FROM usuario u ORDER BY u.$ordem $direcao $limite");

            foreach ($statment->fetchAll(PDO::FETCH_SERIALIZE) as $row){
                $usuario = new UsuarioBean($row['usuarioID'], $row['login'], $row['senha'], $row['email'], $row['ip'], Util::dateToString($row['dataCriacao']));
                $usuario->setStatus($this->statusDAO->buscarPorID($row['statusID']));

                if($carregarDependencias)
                    $usuario->setMedia($this->mediaDAO->buscarPorID($row['mediaID']));

                $usuarios[] = $usuario;
            }

            return $usuarios;
        } catch (PDOException $err) {
            throw new Exception("Erro UsuarioDAO:" . $err->getMessage());
        }
    }

    public function buscarPorID($usuarioID, $carregarDependencias = false) {
        try {

            $row = $this->conexao->query("SELECT * FROM usuario WHERE usuarioID = $usuarioID ")->fetch(PDO::FETCH_SERIALIZE);

            if (isset ($row['usuarioID']) && $row['usuarioID'] > 0) {
                $usuario = new UsuarioBean($row['usuarioID'], $row['login'], $row['senha'], $row['email'], $row['ip'], Util::dateToString($row['dataCriacao']));
                $usuario->setStatus($this->statusDAO->buscarPorID($row['statusID']));

                if($carregarDependencias)
                    $usuario->setMedia($this->mediaDAO->buscarPorID($row['mediaID']));
                return $usuario;
            } else {
                return null;
            }
        } catch (PDOException $err) {
            throw new Exception("Erro UsuarioDAO:" . $err->getMessage());
        }
    }

    protected function getWhere($email = "", $login = "",$statusID = -1) {
        
        $where = " WHERE 1 = 1 ";                

        if (isset($email) && strlen($email) > 0) {
            $where = $where . " AND u.email like '%$email%' ";
        }

        if (isset($login) && strlen($login) > 0) {
            $where = $where . " AND u.login = '$login' ";
        }

        if (isset($statusID) && $statusID > 0) {
            $where = $where . " AND u.statusID = $statusID ";
        }

        return $where;
    }

    public function total($email = "", $login = "",$statusID = -1) {
        try {

            $where = $this->getWhere($email, $login, $statusID);
            $total = $this->conexao->query("SELECT COUNT(u.usuarioID) total FROM usuario u $where")->fetch(PDO::FETCH_COLUMN);
            return $total;
        } catch (PDOException $err) {
            throw new Exception("Erro UsuarioDAO:" . $err->getMessage());
        }
    }

}
?>